
/*
 
JavaScript que checkea los childnodes de un treeview.
http://geekswithblogs.net/ranganh/archive/2006/03/25/73300.aspx

*/

function goDeeperUnChecked(obj) 
{ 
var chk1 = false; 
//Get the mom. 
var head1 = obj.parentElement.previousSibling; 
//no rows, cant do my work. 
if(obj.rows == null) 
{return ;} 

//This is how may rows are at this level. 
var pTreeLevel1 = obj.rows[0].cells.length; 

//Are we a mommy? 
if(head1.tagName == "TABLE") 
{ 
//Get the list of rows ahead of us. 
var tbls = obj.parentElement.getElementsByTagName("TABLE"); 
//get the count of that list. 
var tblsCount = tbls.length; 

//determine if any of the rows underneath are unchecked. 
for (i=0; i < tblsCount; i++) 
{ 
var childTreeLevel = tbls[i].rows[0].cells.length; 
if (childTreeLevel = pTreeLevel1) 
{ 
var chld = tbls[i].getElementsByTagName("INPUT"); 
if (chld[0].checked == true) 
{ 
chk1 = true; 
break; 
} 
} 
} 

var nd = head1.getElementsByTagName("INPUT"); 
// Check if there are any elements first 
if (nd.length>0){ 
nd[0].checked = chk1; 
} 
//do the same for the level above 
goDeeperUnChecked(obj.parentElement); 
} 
else 
{ 
return; 
} 
} 


function goDeeper(obj) 
{ 

//head1 gets the parent node of the checked node 
var head = obj.parentElement.previousSibling; 

if(head.tagName == "TABLE") 
{ 
//checks for the input tag which consists of checkbox 
var matchElement = head.getElementsByTagName("INPUT"); 

//matchElement[0] gives us the checkbox and it is checked 
//something is wrong here, fixed 
if (matchElement.length>0){ 
matchElement[0].checked = true; 
} 

} 
else 
{ 

head = obj.parentElement.previousSibling; 
} 

if(head.tagName == "TABLE") 
{ 
goDeeper(obj.parentElement); 
} 

else 
{ 
return; 
} 
} 
function treeViewCheck() 
{ 
// obj gives us the node on which check or uncheck operation has performed 
var obj = window.event.srcElement; 

var treeNodeFound = false; 

var checkedState; 


//checking whether obj consists of checkbox to avoid exception 

if (obj.tagName == "INPUT" && obj.type == "checkbox") 
{ 
var treeNode = obj; 
checkedState = treeNode.checked; 


//work our way back to the parent <table> element 

do 
{ 
obj = obj.parentElement; 
} 
while (obj.tagName != "TABLE") 

var parentTreeLevel = obj.rows[0].cells.length; 
var parentTreeNode = obj.rows[0].cells[0]; 

//get all the TreeNodes inside the TreeView (the parent <div>) 
var tables = obj.parentElement.getElementsByTagName("TABLE"); 

//checking for any node is checked or unchecked during operation 
if(obj.tagName == "TABLE") 
{ 

// Modified - if any node is checked then their parent node is checked 
if (treeNode.checked) 
{ 
goDeeper(obj); 
} //end if - checked 

//total number of TreeNodes 
var numTables = tables.length 

if (numTables >= 1) 
{ 
//cycle through all the TreeNodes 
//until we find the TreeNode we checked 

for (i=0; i < numTables; i++) 
{ 
if (tables[i] == obj) 
{ 
treeNodeFound = true; 
i++; 
if (i == numTables) 
{ 
//if we're on the last TreeNode, we are done 
break; 
} 
} 
if (treeNodeFound == true) 
{ 

var childTreeLevel = tables[i].rows[0].cells.length; 
if (childTreeLevel > parentTreeLevel) 
{ 
var cell = tables[i].rows[0].cells[childTreeLevel - 1]; 
//set the checkbox to match the checkedState 

var inputs = cell.getElementsByTagName("INPUT"); 
inputs[0].checked = checkedState; 

} 

else 
{ 
//if any of the preceding TreeNodes are not deeper stop 
break; 

} 
} //end if 

}//end for 
} //end if - numTables >= 1 


//Modified - If all child nodes are unchecked then their parent node is unchecked 

if (!treeNode.checked) 
{ 
goDeeperUnChecked(obj); 
}//end if - unChecked 


} //end if - tagName = TABLE 

} //end if 

} //end function 